package io.bd;

import io.Archivo;
import io.Carpeta;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Mariano Zapata
 */
public class ABMRArchivo {
    
    private Connection conexion;
    
    public ABMRArchivo(Connection conexion) {
        this.conexion= conexion;
    }
    
    public void recuperar(Carpeta padre) throws SQLException
    {
        String renglon= "SELECT id, nombre FROM Archivo WHERE carpeta= " + padre.obtenerId() + " ORDER BY nombre";
        List<Archivo> hijos= new ArrayList<Archivo>();
        Statement consulta= conexion.createStatement();
        ResultSet r= consulta.executeQuery(renglon);
        while (r.next())
        {
            List<Long> ruta= padre.obtenerCopiaRuta();
            ruta.add(r.getLong(1));
            Archivo a= new Archivo(ruta);
            a.setNombre(r.getString(2));
            hijos.add(a);
        }
        r.close();
        consulta.close();
        padre.setHijosArchivo(hijos);
    }
    
    public void crear(Archivo a, Carpeta padre, InputStream is) throws SQLException
    {
        String renglon= "INSERT INTO Archivo (nombre, bytes, carpeta) VALUES (?, ?, ?)";
        PreparedStatement consulta= conexion.prepareStatement(renglon);
        consulta.setString(1, a.getNombre());
        consulta.setBinaryStream(2, is);
        consulta.setLong(3, padre.obtenerId());
        consulta.executeUpdate();
        consulta.close();
    }
    
    public InputStream obtenerBytes(Archivo a) throws SQLException
    {
        String renglon= "SELECT bytes FROM Archivo WHERE id= " + a.obtenerId();
        Statement consulta= conexion.createStatement();
        ResultSet r= consulta.executeQuery(renglon);
        r.next();
        InputStream ret= r.getBinaryStream(1);
        r.close();
        consulta.close();
        return ret;
    }
    
    public void cambiarNombre(Archivo a) throws SQLException
    {
        String renglon= "UPDATE Archivo SET nombre= ? WHERE id= ?";
        PreparedStatement consulta= conexion.prepareStatement(renglon);
        consulta.setString(1, a.getNombre());
        consulta.setLong(2, a.obtenerId());
        consulta.executeUpdate();
        consulta.close();
    }
    
    public void guardarBytes(Archivo a, InputStream is) throws SQLException
    {
        String renglon= "UPDATE Archivo SET bytes= ? WHERE id= ?";
        PreparedStatement consulta= conexion.prepareStatement(renglon);
        consulta.setBinaryStream(1, is);
        consulta.setLong(2, a.obtenerId());
        consulta.executeUpdate();
        consulta.close();
    }
    
    public void eliminar(Archivo a) throws SQLException
    {
        String renglon= "DELETE FROM Archivo WHERE id= " + a.obtenerId();
        Statement consulta= conexion.createStatement();
        consulta.executeUpdate(renglon);
        consulta.close();
    }
    
    public void cortar(Archivo a, Carpeta nuevoPadre) throws SQLException
    {
        String renglon= "UPDATE Archivo SET carpeta= " + nuevoPadre.obtenerId() + " WHERE id= " + a.obtenerId();
        Statement consulta= conexion.createStatement();
        consulta.executeUpdate(renglon);
        consulta.close();
    }
    
    public void copiar(Archivo a, Carpeta nuevoPadre) throws SQLException
    {
        InputStream bytes= this.obtenerBytes(a);
        this.crear(a, nuevoPadre, bytes);
    }
    
    public boolean poseeArchivos(Carpeta c) throws SQLException
    {
        String renglon= "SELECT COUNT(id) FROM Archivo WHERE carpeta= " + c.obtenerId();
        Statement consulta= conexion.createStatement();
        ResultSet r= consulta.executeQuery(renglon);
        r.next();
        return (r.getLong(1) > 0);
    }
    
    public boolean existe(Archivo a) throws SQLException
    {
        String renglon= "SELECT nombre FROM Archivo WHERE id= " + a.obtenerId();
        Statement consulta= conexion.createStatement();
        ResultSet r= consulta.executeQuery(renglon);
        boolean retorno= r.next();
        r.close();
        consulta.close();
        return retorno;
    }
}
